
package TokensDelLenguaje;

import PolacaInversa.Registro;
import java.util.ArrayList;

public class Token_OperadorDiv extends Token_Operador{

    public Token_OperadorDiv(){
        super(Tokens.division);
    }
    
    public ArrayList conversionImplicita(Token o1, Token o2, Registro reg) {
        ArrayList list = new ArrayList();
        String s = "";
        Tokens op1 = o1.getId();
        Tokens op2 = o2.getId();
        
        //La logica de la tabla de conversion para este operador
        if (op1 == Tokens.const_uinteger && op2 == Tokens.const_uinteger) {
            s += "MOV dx, 0\n";
            s += "MOV ax, " + o2.getNombre() + "\n";
            list.add(true);
            list.add(s);
            return list;
        }
            else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_ulongint) {
                /*s += "MOV eax, 0\n";
                s += "MOV ax, _" + o1.getCadena()+ "\n";*/
                s += "MOV edx, 0\n";
                s += "MOV eax, " + o2.getNombre() + "\n";
                //s += "DIV _"
                list.add(true);
                list.add(s);
                return list;
            }
                else if (op1 == Tokens.const_uinteger && op2 == Tokens.const_ulongint) {
                    //Generar Assembler.
                    s += "MOV eax, " + o2.getNombre()+ "\n";
                    //s += "DIV " + o1.getNombre() + "\n";
                    list.add(true);
                    list.add(s);
                    return list;
                }
                    else if (op1 == Tokens.const_ulongint && op2 == Tokens.const_uinteger) {
                        //Generar Assembler.
                        s += "MOV edx, 0\n";
                        s += conversion(o2, new Registro("eax", 4));
                        //s += "MOV ax, " + o1.getNombre() + "\n";
                        //s += "DIV " + "" + "\n";
                        list.add(true);
                        list.add(s);
                        return list;
                    }
        list.add(0, true);
        return list;
    }
    
    @Override
    protected String conversion(Token op, Registro reg) {
        //Generar Assembler.
        return ((Token_Dato)op).conversion(reg);
    }
    
    @Override
    public ArrayList traducir_assembler(Token o1, Token o2, Registro reg){
        ArrayList list = super.traducir_assembler(o1, o2, reg);
        ArrayList l = new ArrayList();
        String s = (String) list.get(1);   
        s += "DIV " + o1.getNombre()+ "\n";
        if(o2.getId() == Tokens.const_uinteger)
            s += "MOV " + reg.nombre + ", ax\n";
        else
            s += "MOV " + reg.nombre + ", eax\n";
        l.add(list.get(0));
        l.add(s);
        return l;
    }
}
